package com.qf.day15.stream;

import com.qf.day13.ddz.PukeCard;
import com.qf.day13.ddz.PukeCardUtils;

import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
 * 演示java的新特性之一，Stream
 */
public class StreamDemo {

    public static void main(String[] args) {

        List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

        // 方法引用
        numbers.forEach(System.out::println);


//        test10();


//        test9();
//        test8();
//        test7();
//        test6();
//        test5();
//        test4();
//        test3();
//        test2();
//        test1();

    }

    /**
     * 对集合的数据进行分组
     */
    private static void test10() {
        List<PukeCard> pukeList = PukeCardUtils.createPukeList();

        PukeCardUtils pukeCardUtils = new PukeCardUtils();
        pukeCardUtils.drawCards(pukeList);

        ArrayList<PukeCard> p1 = pukeCardUtils.getP1();

//        Map<String, List<PukeCard>> map = p1.stream().collect(Collectors.groupingBy(x -> x.getPoint()));
//        System.out.println(map);

        Map<String, Long> map = p1.stream().collect(Collectors.groupingBy(x -> x.getPoint(), Collectors.counting()));
        System.out.println(map);
    }

    /**
     * 产生多个随机数
     */
    private static void test9() {
        Random random = new Random();
        // 产生1到100以内的10个随机数，按照从小到达排序
        List<Integer> list = random.ints(1, 200)
                .limit(5)
                .sorted()
                .mapToObj(x -> x)
                .collect(Collectors.toList());
        System.out.println(list);
//                .forEach(x-> System.out.println(x));
    }

    private static void test8() {
        List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
        IntSummaryStatistics statistics = numbers.stream().mapToInt(x -> x).summaryStatistics();
        System.out.println(statistics);
    }

    private static void test7() {
        List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
        numbers.sort((x,y)->x-y);
        System.out.println(numbers);

        List<Integer> list1 = numbers.stream().sorted().collect(Collectors.toList());
        System.out.println(list1);

        List<PukeCard> pukeList = PukeCardUtils.createPukeList();
        List<PukeCard> list2 = pukeList.stream()
                .sorted( (x,y)->y.getValue()-x.getValue() ).collect(Collectors.toList());
        System.out.println(list2);
    }

    /**
     * 过滤元素的案例
     */
    private static void test6() {
        List<PukeCard> pukeList = PukeCardUtils.createPukeList();
        // 把所有红桃牌放到一个list中
        List<PukeCard> heartList = pukeList.stream()
                .filter(pukeCard -> pukeCard.getType().equals("♥"))
                .collect(Collectors.toList());

        System.out.println(heartList);

        // 给我四个A
        List<PukeCard> list2 = pukeList.stream()
                .filter(pukeCard -> pukeCard.getPoint().equals("A"))
                .collect(Collectors.toList());

        System.out.println(list2);

        // 给我四个A四个2和两个王
        List<PukeCard> list3 = pukeList.stream()
                .filter(pukeCard -> pukeCard.getValue() > 10)
                .collect(Collectors.toList());
        System.out.println(list3);
    }

    /**
     * 过滤集合中的元素
     */
    private static void test5() {
        //  Arrays.asList这个方法创建的集合是不可修改的
        List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
        // filter方法用来过滤集合中的元素，如果满足条件的元素，就被保留下来
        List<String> list1 = strings.stream().filter(s -> !s.equals("")).collect(Collectors.toList());
        System.out.println(list1);

//        strings.add("hello");
//        System.out.println(strings);

        // 如果把上面集合中的 空串过滤掉
//        ArrayList<String> list = new ArrayList<>(strings);
//        while (list.remove("")){
//
//        }
//        System.out.println(list);


//        System.out.println(list.remove(""));
//        System.out.println(list);
    }

    /**
     * Reduce方法，将集合中的所有元素合并为一个对象
     */
    private static void test4() {
        List<Integer> numbers = Arrays.asList(3, 1, 2, 4);

        Integer result
                = numbers.stream().reduce(0, (a, b) -> a + b);
        System.out.println(result);
    }

    /**
     * map方法，将 List<PukeCard> ---> List<String>
     */
    private static void test3() {
        List<PukeCard> pukeList = PukeCardUtils.createPukeList();

        // PukeCard 对象 ---> 点数 String
        List<String> list1 = pukeList.stream().map(pukeCard -> pukeCard.getPoint()).collect(Collectors.toList());

        System.out.println(pukeList);
        System.out.println(list1);
    }

    /**
     * 使用map方法实现元素的转换
     */
    private static void test2() {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        // 把每个元素变成原来的值的平方
        System.out.println(list);
        List<Integer> list1 = list.stream().map(integer -> integer * integer)
                .collect(Collectors.toList());  // 把Stream对象转换为list
        System.out.println(list);
        System.out.println(list1);
    }

    private static void test1() {
        List<String> list = Arrays.asList("apple", "banana", "cherry");
        // 使用Stream 访问集合中的每一个元素
        list.stream().forEach(s -> System.out.println(s.toUpperCase()));
    }

}
